package br.com.fogas.notafiscal;

import java.math.BigDecimal;
import java.sql.SQLException;

import br.com.fogas.database.FogasDatabase;
import br.com.fogas.database.entidade.NotaControle;
import br.com.fogas.database.entidade.NotaFiscal;
import br.com.fogas.database.exception.PrecoUnitarioException;
import br.com.fogas.notafiscal.modelo.NFItem;
import br.com.fogas.notafiscal.preco.zfp0.PrecoZFP0;

public class NotaFiscalUtils {
	
	public static double pesoLiquidoItemNota(NFItem item) {
		double peso_aux = (item.getPeso().getLiquido() * item.getQuantidade().doubleValue());
		return valorArredondado(peso_aux).doubleValue();
	}
	
	public static double pesoBrutoItemNota(NFItem item) {
		double peso_aux = (item.getPeso().getBruto() * item.getQuantidade().doubleValue());
		return valorArredondado(peso_aux).doubleValue();
	}
	
	public static BigDecimal precoItemNota(FogasDatabase database, NFItem item, NotaFiscal notaFiscal) throws PrecoUnitarioException {
		PrecoZFP0 ZFP0 = new PrecoZFP0(database, item.isGranel(), item.getMaterial().getTx_cod_material(), notaFiscal);
		return valorArredondado(ZFP0.valor().doubleValue());
	}
	
	public static BigDecimal valorArredondado(double valor) {
		BigDecimal total = new BigDecimal(valor);
		total = total.setScale(2, BigDecimal.ROUND_HALF_UP);
		return total;
	}
	
	public static BigDecimal valorItemNota(BigDecimal valor, BigDecimal quantidade) {
		double valor_aux = (valor.doubleValue() * quantidade.doubleValue());
		return valorArredondado(valor_aux);
	}
	
	public static BigDecimal valorItemICMS(NFItem item) throws PrecoUnitarioException {
		try {
			double pesoLiquido = pesoLiquidoItemNota(item);
			double vlrPmpf = item.getMaterial().getVl_pmpf().doubleValue();
			double vlrAliquota = item.getMaterial().getVl_aliquota().doubleValue();
			
			double valor = (vlrPmpf * pesoLiquido * vlrAliquota);
			
			return valorArredondado(valor);
		} catch (Exception e) {
			throw new PrecoUnitarioException("nao foi possivel processar o valor icms para o material");
		}
	}
	
	public static BigDecimal valorItemBaseICMS(NFItem item) throws PrecoUnitarioException {
		try {
			double pesoLiquido = pesoLiquidoItemNota(item);
			double vlrPmpf = item.getMaterial().getVl_pmpf().doubleValue();
			
			double valor = (vlrPmpf * pesoLiquido);
			return valorArredondado(valor);
		} catch (Exception e) {
			throw new PrecoUnitarioException("nao foi possivel processar o valor base icms para o material");
		}
	}
	
	public static NotaControle proximaNota(FogasDatabase database) throws SQLException {
		NotaControle notaControle = database.getNotaControle().queryForAll().get(0);
		notaControle.setTx_ultima_nota(String.valueOf(Integer.valueOf(notaControle.getTx_ultima_nota()) + 1));
		return notaControle;
	}
}
